{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% import "_macros.html" as macros %}

{% block title %}语音识别模型基准测试系统{% endblock %}

{% block page_content %}
<div class="page-header">
    <a href="{{ url_for('.model') }}">返回语音识别模型总页</a>
    <p>名称: {{ model.name }}</p>
    <p>备注：<span id="note_span">{{ model.note }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span id="add_note_button_span"><a href="javascript:void(0);" onclick="show_finish_add_note({{ model.id }})"><button>添加备注</button></a></span><span id="show_finish_add_note_span"></span></p>
    <p>声学模型：{% if model.acoustic_model_id ==-1 %}无{% else %}<a href="{{ url_for('.am',id=model.acoustic_model_id) }}">{{ acoustic_model_name }}</a>{% endif %}</p>
    <p>发音字典：{% if model.lexicon_dict_id ==-1 %}无{% else %}<a href="{{ url_for('.ld',id=model.lexicon_dict_id) }}">{{ lexicon_dict_name }}</a>{% endif %}</p>
    <p>语言模型：{% if model.lm_id ==-1 %}无{% else %}<a href="{{ url_for('.language_model',id=model.lm_id) }}">{{ language_model_name }}</a>{% endif %}</p>
    <p>解码器：{% if model.decoder_id ==-1 %}无{% else %}<a href="{{ url_for('.dcdr',id=model.decoder_id) }}">{{ decoder_name }}</a>{% endif %}</p>
    <a class="btn btn-default" href="{{ url_for('.model_edit',id=model.id) }}">修改语音识别模型信息</a>
    <a class="btn btn-default" href="{{ url_for('.model_json',id=model.id) }}">导出语音识别模型的json配置文件</a><br>
    <a class="btn btn-default" href="{{ url_for('.model_active',id=model.id) }}">更新活动时间</a>
    <a class="btn btn-default" href="{{ url_for('.model_copy',id=model.id) }}">以此为模版新建</a><br>
    <br>
    <p>根据模型的输入数据、标签数据和计算损失所需数据的形状和类型，代入随机变量，运行语音识别模型的训练和推理过程。一个形状元组和后面跟着的类型字符串对应一个随机张量变量，形状元组、类型字符串之间用英文逗号隔开，示例："(1,1,128,1000),float32,(1,20),int32"。对于基于TensorFlow框架的传统模型的声学模型组件和端到端模型，系统可以自动获取它们的输入节点的形状和类型，将会忽视用户手动输入的模型输入数据信息，对于基于Pytorch框架的模型，还是需要用户提供模型输入数据的形状和类型</p>
    所有输入数据的形状及类型：<input type="text" id="train-input-shape" onkeyup="update_train_action();">
    标签数据的形状及类型：<input type="text" id="train-y-shape" onkeyup="update_train_action();">
    计算损失所需数据的形状及类型：<input type="text" id="train-loss-params-shape" onkeyup="update_train_action();">
    <a class="btn btn-default" href="javascript:void(0);" onclick="start_train_model({{ model.id }});" id="train-model-a">运行训练场景</a>
    <a class="btn btn-default" href="{{ url_for('.debug_train_model',id=model.id,input_shape='',y_shape='',loss_params_shape='') }}" id="debug-train-model-a">调试模型的训练过程</a><br>
    输入数据的形状及类型：<input type="text" id="infer-input-shape" onkeyup="update_infer_action();">
    模型的后处理器编号：<input type="text" id="post-processor-id" onkeyup="update_infer_action();">
    <a class="btn btn-default" href="javascript:void(0);" id="infer-model-a" onclick="start_infer_model({{ model.id }});">运行模型的推理过程</a>
    <a class="btn btn-default" href="{{ url_for('.debug_infer_model',id=model.id,input_shape='')}}" id="debug-infer-model-a">调试模型的推理过程</a><br>
    <span id="span-1"></span><br>
    <span id="span-2"></span><br>
    <span id="span-3"></span>

    {% if bttask_names %}
    <p>
        使用本语音识别模型的基准测试用例有<br>
        {% for i in range(bttask_names|length) %}
        <a href="{{ url_for('.btt',id=bttask_ids[i]) }}">{{ bttask_names[i] }}</a>，
        {% endfor %}
    </p>
    {% endif %}
    {% if test_project_names %}
    <p>
        使用本语音识别模型的测试项目有<br>
        {% for i in range(test_project_names|length) %}
        <a href="{{ url_for('.tp',id=test_project_ids[i]) }}">{{ test_project_names[i] }}</a>，
        {% endfor %}
    </p>
    {% endif %}
    <script type="text/javascript">
        function update_status(url){
            $.getJSON(url,function(data){
                $('#span-1').text($('#span-2').text());
                $('#span-2').text($('#span-3').text());
                if('result' in data){
                    $('#span-3').text(data['time']+' '+data['status']+' '+data['result']);
                }else{
                    $('#span-3').text(data['time']+' '+data['state']+' '+data['status']);
                }
                if(data['state']=='PENDING'||data['state']=='PROGRESS'){
                    setTimeout(function(){
                        update_status(url);
                    },1000);
                }
            });
        }

        function start_train_model(model_id){
            $.ajax({
                type:'POST',
                url:'/train_model/'+model_id+'?input_shape='+$('#train-input-shape').val()+'&y_shape='+$('#train-y-shape').val()+'&loss_params_shape='+$('#train-loss-params-shape').val(),
                success: function(data,status,request){
                    status_url=request.getResponseHeader('Location');
                    update_status(status_url);
                },
                error:function(){
                    alert('运行模型的训练过程的过程中出现错误');
                }
            });
        }

        function start_infer_model(model_id){
            $.ajax({
                type:'POST',
                url:'/infer_model/'+model_id+'?input_shape='+$('#infer-input-shape').val()+'&post_processor_id='+$('#post-processor-id').val(),
                success: function(data,status,request){
                    status_url=request.getResponseHeader('Location');
                    update_status(status_url);
                },
                error:function(){
                    alert('运行模型的推理过程的过程中出现错误');
                }
            });
        }

        function update_train_action(){
            $('#debug-train-model-a').attr('href','/debug_train_model/{{ model.id }}?input_shape='+$('#train-input-shape').val()+'&y_shape='+$('#train-y-shape').val()+'&loss_params_shape='+$('#train-loss-params-shape').val());
        }

        function update_infer_action(){
            $('#debug-infer-model-a').attr('href','/debug_infer_model/{{ model.id }}?input_shape='+$('#infer-input-shape').val()+'&post_processor_id='+$('#post-processor-id').val());
        }

        function show_finish_add_note(model_id){
            $('#add_note_button_span').html('');
            $('#show_finish_add_note_span').html('<input id="note_input" style="width:200px;" value="'+$('#note_span').text()+'"><a href="javascript:void(0);" onclick="add_note('+model_id+');"><button>完成</button></a>');
        }

        function add_note(model_id){
            $.ajax({
                type:'GET',
                url:'/add_model_note?note='+$('#note_input').val()+'&model_id='+model_id,
                success:function(data,status,request){
                    $('#note_span').html($('#note_input').val());
                },
                error:function(){
                    alert('请求添加语音识别模型的备注的过程中出现错误');
                }
            });
            $('#add_note_button_span').html('<a href="javascript:void(0);" onclick="show_finish_add_note('+model_id+');"><button>添加备注</button></a>');
            $('#show_finish_add_note_span').html('');
        }
    </script>
</div>
{% endblock %}